package com.lbj.mall.order.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;

/**
 * 配置SpringSession的步骤
 * - 第1步引入配置文件：
 *  <dependency>
 *    <groupId>org.springframework.session</groupId>
 *    <artifactId>spring-session-data-redis</artifactId>
 * </dependency>
 * - 第2步开启注解
 *  在Application中添加EnableRedisHttpSession注解
 * - 第3步配置httpsession使用存储的介质（redis）
 *  spring.session.store-type=redis
 * - 第4步配置存储json格式到redis,默认使用java序列化，这样还需要我们实现序列化接口
 *  RedisSerializer
 * - 第5步配置Cookie
 *  经过前4步的配置我们可以将session以JSON的格式保存到redis中，但是在主域名和子域名中依然无法
 *  共用保存的session,因此我们还需要配置cookie,主要就是将domain设置成主域名，这样不管在哪里
 *  保存的session都可以使用，配置逻辑就是将（auth.localmall.com）->(localmall.com)
 *  虽然配置了localmall.com，但其实在浏览器中会在前面默认添加一个（.），变成（.localmall.com）
 *  其实在浏览器中就是（.localmall.com），如果使用（localmall.com）是访问不到的。
 */
@EnableRedisHttpSession
@Configuration
public class AppSessionConfig {

    /**
     * 使用SpringSession存储数据到Redis时，配置使用JSON格式（默认使用序列化）
     */
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }

    /**
     * 为什么要配置Cookie？
     * - 因为session会把数据保存到JSESSION中并交给cookie中；
     * 同时会设置 Domain 的值为当前域名，但是在分布式中，仅仅当前域名是不够的
     * 需要配置主域名（localmall.com），在浏览器中会在前面加上一个.，变成（.localmall.com）
     * 同时Session的名字会被设置成SESSION
     */
    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        cookieSerializer.setDomainName("localmall.com");
        cookieSerializer.setCookieName("MALLSESSION");
        return cookieSerializer;
    }
}
